package proms.net.modelo.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import proms.net.conexao.Conexao;
import proms.net.modelo.bean.Acesso;

public class AcessoDAO {

	private Conexao conexao;

	public AcessoDAO() {
		
	}
	
	public void salvar(List<Acesso> acessos) throws SQLException
	{
		Connection con = conexao.conecta();
		PreparedStatement ps;
		String sqlInsert = "INSERT INTO acesso_usuario ( usuario_codigo,acesso_codigo) " +
				" VALUES (?, ?);";
		try{
			ps = con.prepareStatement(sqlInsert);
			
			for(Acesso acesso: acessos)
			{
                                ps.setInt(1, acesso.getUsuario_codigo());
				ps.setInt(2, acesso.getAcesso_codigo());
				
				ps.addBatch();
			}
			
			ps.executeBatch();
			ps.close();
		}finally
		{
			conexao.desconecta();
		}
	}
	
	public void excluir(Integer codigoUsuario) throws SQLException
	{
		Connection con = conexao.conecta();
		PreparedStatement ps;
		try{
			String sqlDelete = "DELETE FROM acesso_usuario WHERE usuario_codigo = ? ;";
			ps = con.prepareStatement(sqlDelete);
			ps.setInt(1, codigoUsuario);
			ps.executeUpdate();
			ps.close();
		}
		finally
		{
			conexao.desconecta();
		}
	}
	
	public Map<String, Acesso> getAcessosUsuario(Integer codigoUsuario) throws SQLException
	{
		Map<String, Acesso> resultado = new HashMap<String, Acesso>();
		String sqlSelect = "SELECT * FROM acesso AS a LEFT JOIN acesso_usuario AS af " +
				" ON a.codigo = af.acesso_codigo AND af.usuario_codigo = ? ORDER BY a.codigo;";
		Connection con = conexao.conecta();
		PreparedStatement ps;
		try{
			
			ps = con.prepareStatement(sqlSelect);
			ps.setInt(1, codigoUsuario);
			ResultSet rs = ps.executeQuery();
			while(rs.next())
			{
				Acesso acesso = new Acesso();
				acesso.setAcesso_codigo(rs.getInt("codigo"));
				acesso.setComando(rs.getString("comando"));
				acesso.setDescricao(rs.getString("descricao"));
				acesso.setUsuario_codigo(rs.getInt("usuario_codigo"));
				resultado.put(acesso.getComando(), acesso);
			}
			rs.close();
			ps.close();
			return resultado;
		}
		finally
		{
			conexao.desconecta();
		}
		
	}
}

